package day04;

import java.util.HashSet;
import java.util.Set;

public class 无重复字符的最长子串 {
    public int lengthOfLongestSubstring(String s) {
        int ret = 0;
        // 转换为字符数组
        char[] ch = s.toCharArray();
        //计算长度
        int n = ch.length;
        // 创建set 目的去重
        Set<Character> hashSet = new HashSet<>();
        // 利用双指针
        for (int left = 0, right = 0; right < n; right++) {
            // 进行判断,要考虑一种情况，重复的字符不在第一个，所以要用循环来进行判断
            while (hashSet.contains(ch[right])) {
                // 进行删除
                //按照左指针的顺序进行删除
                hashSet.remove(ch[left]);
                // 左指针进行加一
                left++;
            }
            hashSet.add(ch[right]);
            ret = Math.max(ret, right - left + 1);
        }
        return ret;
    }
    /*public int lengthOfLongestSubstring(String s) {
        // 将字符串转换为字符数组
        char[] ch = s.toCharArray();
        // 利用数组模拟哈希表
        int[] hash = new int[128];
        int n = ch.length;
        // 定义左右指针
        int left = 0, right = 0;
        int len = 0;
        while (right < n) {
            // 首先右窗口进入
            hash[ch[right]]++;
            while (hash[ch[right]] > 1) {
                // 此时停止，左指针划出窗口
                hash[ch[left]]--;
                left++;
            }
            len = Math.max(len,right - left + 1);
            right++;
        }
        return len;
    }*/
}
